use chrono::{DateTime, Duration, FixedOffset, Local, TimeZone, Utc};

fn main() {

    let utc: DateTime<Utc> = Utc::now();
    let local: DateTime<Local> = Local::now();
    println!("世界标准时间: {}", utc);
    println!("系统当前时间: {}", local);

    // 获取当前时间，并格式化
    let date_time_one = Local::now().format("%Y-%m-%d %H:%M:%S");
    let date_time_zone = Local::now().format("%Y-%m-%d %H:%M:%S %z");
    let date_time_two = Local::now().format("%Y-%m-%d %H:%M:%S %z").to_string();
    println!("当前时间格式化: {}", date_time_one);
    println!("当前时间格式化带时区: {}", date_time_zone);
    println!("当前时间格式化并转字符串: {}", date_time_two);

    // 获取当前日期
    let data = Local::now().date_naive().format("%Y-%m-%d").to_string();
    println!("当前日期: {}", data);

    // 获取当前时间
    let time = Local::now().time().format("%H:%M:%S").to_string();
    println!("当前时间: {}", time);

    // 获取当前时间的时间戳
    let timestamp = Local::now().timestamp();
    println!("当前时间的时间戳: {}", timestamp);

    // Local 不是时区感知的，他默认使用当前系统时区，因此可以不主动设置时区，使用默认即可
    // 将时间戳转成日期时间
    let dt = Local::timestamp_opt(&Local,timestamp,0).unwrap();
    println!("时间戳转当前时间: {}", dt);

    // 东八区TZ    和世界标准时间UTC的时差，或者说时间偏移量
    let tz_offset = FixedOffset::east_opt(8 * 3600).unwrap();
    println!("东八区TZ: {:?}", tz_offset);

    // DateTime 是时区感知的，必须从 TimeZone 对象构造并设置，可以将 tz_offset 借用作为时区传递
    // 如果需要创建时区不同于 Utc 的日期时间，请使用 TimeZone::timestamp_opt 或者 DateTime::with_timezone.
    // 将时间戳解析成时间
    let dt = DateTime::from_timestamp(timestamp, 0).unwrap().with_timezone(&tz_offset);
    println!("将时间戳解析成时间: {}", dt);

    // 将字符串解析成日期时间
    let pt = DateTime::parse_from_str(&date_time_two, "%Y-%m-%d %H:%M:%S %z").unwrap();
    println!("解析指定时间: {}", pt);

    // 时间单位转换
    let dt = Duration::minutes(60).num_hours();
    println!("Duration分钟转小时: {}", dt);
    let dt = Duration::minutes(30).num_seconds();
    println!("Duration分钟转秒: {}", dt);
}
